// class Solution {
// public:
//     string minWindow(string s, string t) {
//        unordered_map<char,int> need;
//        unordered_map<char,int> window;

//        for(char a:t)
//        {
//         need[a]++;
//        } //统计t中字符个数

//        int l=0;
//        int count=0;
//        int length=INT_MAX;
       
//        for(int i=0;i<s.size();i++)
//        {
//         if(need.count(s[i]))
//         {
//             window[s[i]]++;
//         }
//         if(window[s[i]]==need[s[i]])
//         {
//             ++count;
//         }

//         while(count==t.size())
//         {
            
//         }
//        }
//     }
// };

class Solution {
public:
    string minWindow(string s, string t) {
       unordered_map<char,int> need;
       unordered_map<char,int> window;
       for(char a:t)
       {
        need[a]++;
       } //统计t中字符个数

       int l=0,start=0;
       int count=0;
       int length=INT_MAX;
       
       for(int i=0;i<s.size();i++)
       {
        if(need.count(s[i]))
        {
            window[s[i]]++;
        }
        if(window[s[i]]==need[s[i]])
        {
            ++count;
        }
        
        while(count==t.size())
        {
            if(i-l<length)
            {
                start=l;
                length=i-l+1;
            }
            if(need.count(s[l]))
            {
                window[s[l]]--;
            }
            if(window[s[l]]<need[s[l]])
            {
                count--;
            }
            l++;
        }
        
       }

       return length==INT_MAX?"":s.substr(start,length);
    }
};